package com.java.simple.smallspring.beans.factory.config;

import com.java.simple.smallspring.beans.BeansException;
import com.java.simple.smallspring.beans.PropertyValues;

/**
 * @author zhoujunlin
 * @date 2022年09月11日 21:05
 * @desc
 */
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

    /**
     * 在bean对象实例化之前 执行此方法
     *
     * @param beanClass
     * @param beanName
     * @return
     * @throws BeansException
     */
    Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;

    /**
     * 在Bean对象执行初始化方法之后  执行此方法
     *
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;

    /**
     * 在Bean对象实例化完成之后 设值属性操作之前执行此方法
     *
     * @param pvs
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    PropertyValues postProcessPropertyValues(PropertyValues pvs, Object bean, String beanName) throws BeansException;

    /**
     * 在Spring中由SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference提供
     *
     * @param bean
     * @param beanName
     * @return
     */
    default Object getEarlyBeanReference(Object bean, String beanName) {
        return bean;
    }

}
